};
if let Some(list) = members {
- let root = root_manifest.parent().unwrap();
for path in list {
+ let root = root_manifest.parent().unwrap();
let manifest_path = root.join(path).join("Cargo.toml");
- self.find_path_deps(&manifest_path)?;
+ self.find_path_deps(&manifest_path, false)?;
}
}
- self.find_path_deps(&root_manifest)
+ self.find_path_deps(&root_manifest, false)
}
- fn find_path_deps(&mut self, manifest_path: &Path) -> CargoResult<()> {
+ fn find_path_deps(&mut self, manifest_path: &Path, is_path_dep: bool) -> CargoResult<()> {
let manifest_path = paths::normalize_path(manifest_path);
if self.members.iter().any(|p| p == &manifest_path) {
return Ok(())
}
+ if is_path_dep
+ && !manifest_path.parent().unwrap().starts_with(self.root())
+ && self.find_root(&manifest_path)? != self.root_manifest {
+ // If `manifest_path` is a path dependency outside of the workspace,
+ // don't add it, or any of its dependencies, as a members.
+ return Ok(())
+ }
debug!("find_members - {}", manifest_path.display());
self.members.push(manifest_path.clone());
.collect::<Vec<_>>()
};
for candidate in candidates {
- self.find_path_deps(&candidate)?;
+ self.find_path_deps(&candidate, true)?;
}
Ok(())
}
assert_that(p.cargo("build").cwd(p.root().join("foo")), execs().with_status(0));
assert_that(p.cargo("build").cwd(p.root().join("bar")), execs().with_status(0));
+}
+
+#[test]
+fn path_dep_outside_workspace_is_not_member() {
+ let p = project("foo")
+ .file("ws/Cargo.toml", r#"
+ [project]
+ name = "ws"
+ version = "0.1.0"
+ authors = []
+
+ [dependencies]
+ foo = { path = "../foo" }
+
+ [workspace]
+ "#)
+ .file("ws/src/lib.rs", r"extern crate foo;")
+ .file("foo/Cargo.toml", r#"
+ [project]
+ name = "foo"
+ version = "0.1.0"
+ authors = []
+ "#)
+ .file("foo/src/lib.rs", "");
+ p.build();
+
+ assert_that(p.cargo("build").cwd(p.root().join("ws")),
+ execs().with_status(0));
}
\ No newline at end of file